/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sopra09.lv6659438.controller.eintragErfassen;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.actions.LookupDispatchAction;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import java.util.*;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import sopra09.lv6659438.logik.eintragErfassen.EintragErfassenALLocal;
import sopra09.lv6659438.objekte.Autor;
import sopra09.lv6659438.objekte.Buch;

/**
 * Verarbeitet die Daten von neu erfassten Büchern und initialisiert die
 * Bearbeitung von Autoren.
 * @author TJ
 */
public class BuchErfassenLDA extends LookupDispatchAction {
    
    /* forward name="success" path="" */
    private final static String WEITER = "weiter";
    private final static String AUTOR_WAEHLEN = "autorWaehlen";

    /** Provides the mapping from resource key to method name.
     * @return Resource key / method name map.
     */
    protected Map getKeyMethodMap() {
      Map map = new HashMap();
      map.put("buchbutton.weiter", "literatureingabeVerarbeiten");
      map.put("buchbutton.autorwaehlen", "autorenBearbeitenStarten");

      return map;
    }
    
    /** Action called on buchbutton.weiter.
     * Verarbeitet die eingegebenen Buchdaten.
     */
    public ActionForward literatureingabeVerarbeiten(ActionMapping mapping,
          ActionForm form,
          HttpServletRequest request,
          HttpServletResponse response) throws Exception {

      log.warn("literatureingabeVerarbeiten(...) beginnt.");
      Buch buch = (Buch) request.getSession().getAttribute("buch");

      // test ob das buch null ist
      if (buch == null ){
            log.warn("da buch == null ) "
                    + (buch == null ) +
                " ist, wird an " + mapping.getInputForward().getPath() + " weitergeleitet" +
                " und fehlermeldung.keinBuchAusgewaehlt ausgegeben");
          ActionMessages fehler = new ActionMessages();
          fehler.add("keinBuchAusgewaehlt", new ActionMessage("fehlermeldung.keinBuchAusgewaehlt"));
          saveErrors(request, fehler);

          return mapping.getInputForward();
      }

      // test ob für das buch eine autorenmenge erzeugt wurde
      Set<Autor> autoren = (Set<Autor>) buch.getAutoren();
      if (autoren == null){
            log.warn("da autoren == null ) "
                    + (autoren == null) +
                " ist, wird an " + mapping.getInputForward().getPath() + " weitergeleitet" +
                " und fehlermeldung.buchOhneAutor ausgegeben");
          ActionMessages fehler = new ActionMessages();
          fehler.add("buchOhneAutor", new ActionMessage("fehlermeldung.buchOhneAutor"));
          saveErrors(request, fehler);

          return mapping.getInputForward();
      }


      log.warn("das zu verarbeitende Buch hat folgende Attribute: \n" +
              "- titel: " + buch.getTitel() + "\n" +
              "- jahr: " + buch.getJahr() + "\n" +
              "- die Anzahl)der Autoren ist: " + buch.getAutoren().size()
              );      

    // das buch zur verarbeitung an die anwendungslogik weiterreichen
     InitialContext ic = new InitialContext();
     EintragErfassenALLocal eintragErfassen = (EintragErfassenALLocal)
              ic.lookup("java:comp/env/ejb/eintragErfassen");      

     boolean erfolg =  eintragErfassen.erfasseBuch(buch);

    // buch erfolgreich verarbeitet
    if(erfolg) {
        log.warn("da erfolg " + erfolg +
                " ist, wird an " + mapping.findForward(WEITER).getPath() + " weitergeleitet." +
                " Vorher werden buch, autorenListe und autoren im Session Scope auf null gesetzt.");

      request.getSession().setAttribute("autorenListe", null);
      request.getSession().setAttribute("autoren", null);
      request.getSession().setAttribute("buch", null);
      request.getSession().setAttribute("AWF", "Literatureintrag erfassen");
      request.getSession().setAttribute("AA", "Typ auswählen");

      return mapping.findForward(WEITER);

     // buch nicht erfolgreich verarbeitet
    } else {
        log.warn("da erfolg " + erfolg +
                " ist, wird an " + mapping.getInputForward().getPath() + " weitergeleitet" +
                " und fehlermeldung.buchErfassen ausgegeben. " +
                " Vorher werden buch, autorenListe und autoren im Session Scope auf null gesetzt.");

          request.getSession().setAttribute("autorenListe", null);
          request.getSession().setAttribute("autoren", null);
          request.getSession().setAttribute("buch", null);
          ActionMessages fehler = new ActionMessages();
          fehler.add("eingabeNichtVerarbeitet", new ActionMessage("fehlermeldung.buchErfassen"));
          saveErrors(request, fehler);

          return mapping.getInputForward();
    }
 }
    
    /** Action called on buchbutton.autorwaehlen
     * Startet und initialisiert den AWF Autoren bearbeiten
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return ActionForward
     */
    public ActionForward autorenBearbeitenStarten(ActionMapping mapping,
          ActionForm form,
          HttpServletRequest request,
          HttpServletResponse response) throws Exception {
      log.warn("autorenBearbeitenStarten(...) beginnt.");

      log.warn("es wird geprüft, ob schon eine ausgewähltes Buch im Session-Scope liegt: ");
      Buch ausgewaehltesBuch = (Buch) request.getSession().getAttribute("buch");

      // es existiert kein ausgewaehltes buch im session scope, daher wird ein
      // neues buchobjekt aus der annwendungslogik angefordert und im session scope
      // abgelegt.
      if (ausgewaehltesBuch == null) {
          log.warn("der test (ausgewaehltesBuch == null) ergibt: " + (ausgewaehltesBuch == null));
          BuchErfassenVF vf = (BuchErfassenVF) form;
          int jahr = vf.getJahr();
          String titel = vf.getTitel();

          log.warn("eingegebenes jahr ist: " + jahr);
          log.warn("eingegebener titel ist: " + titel);

          InitialContext ic = new InitialContext();
          EintragErfassenALLocal eintragErfassen = (EintragErfassenALLocal)
          ic.lookup("java:comp/env/ejb/eintragErfassen");

          Buch neuesBuch =
                  eintragErfassen.liefereNeuesBuchobjekt(titel, jahr);
          log.warn("ein neues Buchobjekt wurde geliefert: " + neuesBuch.toString());

          request.getSession().setAttribute("buch", neuesBuch);
          log.warn("das neue Buchobjekt wurde als " +
                request.getSession().getAttribute("buch").toString() +
                " im Sessionscope abgelegt");

          request.getSession().setAttribute("neu", true);
          log.warn("ein Attribut 'neu' im Sessionscope wurde mit " +
                  request.getSession().getAttribute("neu") + " belegt");

      // es existiert bereits ein ausgewaehltes buch im session scope
      } else {
        log.warn("der test (ausgewaehltesBuch == null) ergibt: " + (ausgewaehltesBuch == null) + "\n" +
                " , daher wird mit dem vorhandenen Buch weitergearbeitet.");
      }

      log.warn("es wird an " + mapping.findForward(AUTOR_WAEHLEN).getPath() +
              " weitergeleitet");

      return mapping.findForward(AUTOR_WAEHLEN);
    }  

}